import QtQuick 2.9
import QtQuick.Window 2.9
import QtQuick.Controls 2.0
import MyCppObject 1.0 // 导入我们注册的C++模块

Window {
    id: root
    visible: true
    width: 500
    height: 300
    title: qsTr("QML调用Cpp对象")
    color: "green"

    // 定义QML信号
    signal qmlSignalA
    signal qmlSignalB(string str, int value)

    // 鼠标点击区域
    MouseArea {
        anchors.fill: parent
        acceptedButtons: Qt.LeftButton | Qt.RightButton

        onClicked: {
            if (mouse.button === Qt.LeftButton) {
                console.log('----qml 点击左键：Cpp发射信号')
                cpp_obj.name = "qmlNameStr"  // 修改属性会触发set函数
                cpp_obj.year = 2025          // 修改属性会触发set函数
                cpp_obj.sendSignal()         // 调用Q_INVOKABLE宏标记的函数
            } else {
                console.log('----qml 点击右键：QML发射信号')
                root.qmlSignalA()
                root.qmlSignalB('gongjianbo', 1992)
            }
        }
    }

    // 使用注册的C++类型
    CppObject {
        id: cpp_obj
        // 也可以像原生QML对象一样操作，增加属性之类的
        property int counts: 0

        onYearChanged: {
            counts++
            console.log('qml onYearChanged', counts)
        }

        onCppSignalA: console.log('qml onCppSignalA')
        onCppSignalB: console.log('qml onCppSignalB', str, value)
    }

    // 组件加载完成执行
    Component.onCompleted: {
        // 关联信号与信号处理函数的方式同QML中的类型
        // Cpp对象的信号关联到Qml
        cpp_obj.onCppSignalA.connect(function(){ console.log('qml signalA process') })
        cpp_obj.onCppSignalB.connect(processB)

        // Qml对象的信号关联到Cpp
        root.onQmlSignalA.connect(cpp_obj.cppSlotA)
        root.onQmlSignalB.connect(cpp_obj.cppSlotB)
    }

    // 定义的函数可以作为槽函数
    function processB(str, value) {
        console.log('qml function processB', str, value)
    }

    // 显示当前属性值
    Text {
        anchors.centerIn: parent
        text: "姓名: " + cpp_obj.name + "\n年份: " + cpp_obj.year
        color: "white"
        font.pixelSize: 20
    }
}
